from abc import ABC, abstractmethod


# 抽象基类，定义算法的骨架
class AbstractClass(ABC):
    # 模板方法，定义了算法的骨架
    def template_method(self):
        self.specific_method1()
        self.specific_method2()

    # 抽象方法，子类必须实现
    @abstractmethod
    def specific_method1(self):
        pass

    # 抽象方法，子类必须实现
    @abstractmethod
    def specific_method2(self):
        pass

    # 可选的非抽象方法，子类可以选择覆盖
    def hook_method(self):
        print("Hook method called from base class.")

    # 具体子类A，实现抽象方法


class ConcreteClassA(AbstractClass):
    def specific_method1(self):
        print("ConcreteClassA: Implementing specific method 1.")

    def specific_method2(self):
        print("ConcreteClassA: Implementing specific method 2.")

        # 覆盖非抽象方法

    def hook_method(self):
        print("ConcreteClassA: Overriding hook method.")

    # 具体子类B，实现抽象方法


class ConcreteClassB(AbstractClass):
    def specific_method1(self):
        print("ConcreteClassB: Implementing specific method 1.")

    def specific_method2(self):
        print("ConcreteClassB: Implementing specific method 2.")

    # 使用示例


if __name__ == "__main__":
    a = ConcreteClassA()
    a.template_method()  # 调用模板方法，执行算法骨架

    b = ConcreteClassB()
    b.template_method()  # 调用模板方法，执行算法骨架

"""
ConcreteClassA: Implementing specific method 1.
ConcreteClassA: Implementing specific method 2.
ConcreteClassB: Implementing specific method 1.
ConcreteClassB: Implementing specific method 2.
"""